package com.lighting.shortlink.project.toolkit

import cn.hutool.core.lang.hash.MurmurHash

/**
 *
 * @author : lighting
 */
class HashUtil {
//    BASE62的编码字符集
    private static final char[] CHARS = new char[]{
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
    };
//  字符的数量
    private static final int SIZE = CHARS.length;

    /**
     * Hash值转62进制编码
     * @param str 输入 UUID + 长链接
     */
    public static String hashToBase62(String str)
    {
        int i = MurmurHash.hash32(str);//返回一个 32 位二进制的整数哈希值
        long num = i < 0 ? Integer.MAX_VALUE - (long)i : i;//处理负数，负数转正数
        return convertDecToBase62(num);//将哈希值转换为 Base62编码并返回
    }
    /**
     * 十进制 转 62进制
     * @param num 此处的 num 二进制 肯定是 32+位的，当出现负数转正数时，可能会出现 33位
     * @return
     */
    private static String convertDecToBase62(long num) {

        StringBuilder sb = new StringBuilder();
        while (num > 0)
        {
//            SIZE = 62 ≈ 2^6
//            2^32 = (2^6)^5  换而言之，会生成长度为 6 的字符串
            int i = (int)(num % SIZE);
            sb.append(CHARS[i]);
            num /= SIZE;
        }
        return sb.reverse().toString();//反转后再返回
    }
}
